package com.ingenio.siot.adapter;

import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.ingenio.siot.Adapter;
import com.ingenio.siot.entity.Linea;
import com.ingenio.siot.entity.Parametro;
import com.ingenio.siot.entity.Transito;
import com.mysql.jdbc.CallableStatement;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

public class TransitoAdapter extends Adapter{
	
	public List<Transito> devolverTransitoPendiente() throws Exception{
    	Connection conn = null;
    	List<Transito> transitoPendiente = new ArrayList<Transito>();
    	PreparedStatement stmt = null;
		try {
			LineaAdapter la = new LineaAdapter();
			Linea l = null;
			conn = (Connection) abrirConexion();
			String sel ="SELECT * from transitos where procesado = 0";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		ResultSet result = stmt.executeQuery();
    		Transito t = null;
    		
    		while(result.next()){
    			Integer idLinea = result.getInt("IdLinea");
    			l = la.devolverLinea(idLinea);
    			Date fechaEstado = result.getTimestamp("fechaEstado");
    			Integer canActual = result.getInt("cantidadActual");
    			Integer canPasada = result.getInt("cantidadPasada");
    			Double velocidadPromedio = result.getDouble("velocidadPromedio");
    			Double densidadOcupada = result.getDouble("densidadOcupada");
    			t = new Transito(l, fechaEstado, canActual, velocidadPromedio, canPasada, densidadOcupada, false);
    			transitoPendiente.add(t);
    		}
		}
		catch (Exception e) {
			e.printStackTrace(); 
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
    	return transitoPendiente;
    }
	
	public Transito devolverTransito(Integer idLinea, Timestamp fechaEstado) throws Exception{
    	Connection conn = null;
    	Transito t = null;
    	PreparedStatement stmt = null;
    	LineaAdapter la = new LineaAdapter();
    	Linea l = null;
		try {
			conn = (Connection) abrirConexion();
			String sel ="SELECT * from transitos WHERE IdLinea=? and fechaEstado=?";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setInt(1, idLinea);
    		stmt.setTimestamp(2, fechaEstado);
    		ResultSet result = stmt.executeQuery();
    		
    		if(result.next()){
    			l = la.devolverLinea(idLinea);
    			Integer canActual = result.getInt("cantidadActual");
    			Integer canPasada = result.getInt("cantidadPasada");
    			Double velocidadPromedio = result.getDouble("velocidadPromedio");
    			Double densidadOcupada = result.getDouble("densidadOcupada");
    			t = new Transito(l, fechaEstado, canActual, velocidadPromedio, canPasada, densidadOcupada, false);
    		}
		}
		catch (Exception e) {
			e.printStackTrace(); 
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
    	return t;
    }
	
	public Transito devolverTransito(Integer idLinea, Timestamp fechaEstado, Connection conn) throws Exception{
    	Transito t = null;
    	PreparedStatement stmt = null;
    	LineaAdapter la = new LineaAdapter();
    	Linea l = null;
		try {
			String sel ="SELECT * from transitos WHERE IdLinea=? and fechaEstado=?";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setInt(1, idLinea);
    		stmt.setTimestamp(2, fechaEstado);
    		ResultSet result = stmt.executeQuery();
    		
    		if(result.next()){
    			l = la.devolverLinea(idLinea);
    			Integer canActual = result.getInt("cantidadActual");
    			Integer canPasada = result.getInt("cantidadPasada");
    			Double velocidadPromedio = result.getDouble("velocidadPromedio");
    			Double densidadOcupada = result.getDouble("densidadOcupada");
    			t = new Transito(l, fechaEstado, canActual, velocidadPromedio, canPasada, densidadOcupada, false);
    		}
		}
		catch (Exception e) {
			e.printStackTrace(); 
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	return t;
    }
	
	public void actualizarTransitoPendiente(List<Transito> transitoPendiente) throws Exception{
    	Connection conn = null;
    	PreparedStatement stmt = null;
		try {
			conn = (Connection) abrirConexion();
			String sel ="UPDATE transitos SET procesado = 1 WHERE IdLinea = ? and fechaEstado = ?";
    		
    		for (Transito tr : transitoPendiente){
    			stmt = (PreparedStatement) conn.prepareStatement(sel);
    			stmt.setInt(1, tr.getLinea().getIdLinea());
    			stmt.setTimestamp(2, new Timestamp(tr.getFechaEstado().getTime()));
    			stmt.execute();
    		}
		}
		catch (Exception e) {
			e.printStackTrace(); 
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
	}
	
	public boolean insertarTransito(Timestamp fechaEstado) throws Exception{
		Connection conn = null;
		CallableStatement callableStatement = null;
		ParametroAdapter pa = new ParametroAdapter();
		Parametro p = pa.devolverParametro("TIEMPO_TRANSITO");
		String storeProc = "{call InsertarTransito(?,?)}";
		boolean resp = false;
		try {
			conn = (Connection) abrirConexion();
			callableStatement = (CallableStatement) conn.prepareCall(storeProc);
			callableStatement.setInt(1, Integer.parseInt(p.getValor()));
			callableStatement.setTimestamp(2, fechaEstado);
			resp = callableStatement.execute();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
    		cerrarConexion(conn);
    	}
		return resp;
	}
}
